#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>

void handler(int sig)
{
    pid_t id;
    while ((id = waitpid(-1, NULL, WNOHANG)) > 0)   //这里的-1表示来一个子进程退出码，我就给你退出掉并清除资源
    //这里是非阻塞的等待子进程退出
    {
        printf("wait child success: %d\n", id);
    }
    printf("child is quit! %d\n", getpid());
}
int main()
{
    signal(SIGCHLD, handler);//signal(SIGCHLD, SIG_ING);
    pid_t cid;
    if ((cid = fork()) == 0)
    { // child
        printf("child : %d\n", getpid());
        sleep(3);
        exit(1);
    }
    while (1)
    {
        printf("father proc is doing some thing!\n");
        sleep(1);
    }
    return 0;
}

// int quit=0;  //保证内存的可见性
// void handler(int signo)
// {
//     printf("捕捉到%d号信号,quit = %d\n",signo,quit);
//     quit=1;
//     printf("quit = %d\n",quit);

// }

// int main()
// {
//     signal(2,handler);
//     while(!quit);
//     printf("这里的进程 是正常退出的");

//     return 0;
// }

// mysignal.cc
//  #include <iostream>
//  #include <cstdio>
//  #include <signal.h>
//  #include <unistd.h>
//  using namespace std;
//  #define Max_SigNum 32
//  void Count()
//  {
//      int cnt =20;
//      sigset_t pending;
//      sigemptyset(&pending);
//      while (cnt)
//      {
//        sigpending(&pending);
//        for(int signo = Max_SigNum;signo>=1;signo--)
//         {
//          if(sigismember(&pending,signo)) cout<<"1";
//          else cout<<"0";
//         }
//         fflush(stdout);
//          sleep(1);
//          cnt--;
//      }
//  }
//  void handler(int signo)
//  {
//      cout<<"捕捉到的信号为"<<signo<<endl;
//      Count();
//  }

// int main()
// {

//     struct sigaction act, oact;
//     act.sa_handler = handler;
//     sigemptyset(&act.sa_mask);
//     act.sa_flags=0;
//     sigaddset(&act.sa_mask,3);
//     sigaction(SIGINT,&act,&oact);
//     while(true) sleep(1);

//     return 0;

// }